﻿//#include <iostream>
//#include <shared_mutex>
//#include <mutex>
//#include <thread>
//#include <vector>
//#include <chrono>
//#include <syncstream>
//using TimeMutux = std::shared_timed_mutex;
//#define _COUT
////#define MY_COUT std::cout
//// C++20⽀持，⽤于多线程同步的输出，保证顺序不乱 
//#define MY_COUT std::osyncstream(std::cout)
//class ThreadSafeCounter {
//public:
//	ThreadSafeCounter() = default;
//	// 多个线程可以同时读取计数器 
//	unsigned int get() const {
//		//std::unique_lock<TimeMutux> lock(mutex_);
//		std::shared_lock<TimeMutux> lock(mutex_);
//		return value_;
//	}//	// 只有⼀个线程可以修改计数器 
//	void increment() {
//		std::unique_lock<TimeMutux> lock(mutex_);
//		++value_;
//	}
//	// 尝试获取独占锁来修改计数器 
//	bool try_increment() {
//		std::unique_lock<TimeMutux> lock(mutex_, std::try_to_lock);
//		if (lock.owns_lock()) {
//			++value_;
//			return true;
//		}
//		return false;
//	}
//	// ⼀段时间内尝试获取独占锁来修改计数器 
//	bool try_increment_for(int milliseconds) {
//		std::unique_lock<TimeMutux> lock(
//			mutex_, std::chrono::milliseconds(milliseconds));
//		if (lock.owns_lock()) {
//			++value_;
//			return true;
//		}
//		return false;
//	}
//private:
//	// 这⾥添加mutable主要是在get函数是const成员函数，在get函数中是需要修改mutex_对象的
//	mutable TimeMutux mutex_;
//	unsigned int value_ = 0;
//};
//
//
//int main() {
//	ThreadSafeCounter counter;
//	const int N = 10;
//	// 创建多个读取线程 
//	auto reader = [&counter]() {
//		for (int i = 0; i < N; ++i) {
//#ifdef _COUT
//			std::this_thread::sleep_for(std::chrono::milliseconds(50));
//			MY_COUT << "Thread " << std::this_thread::get_id()
//				<< " read: " << counter.get() << std::endl;
//#else//			counter.get();
//#endif 
//		}
//		};
//	// 创建多个写⼊线程 
//	auto writer = [&counter]() {
//		for (int i = 0; i < N / 2; ++i) {
//#ifdef _COUT
//			std::this_thread::sleep_for(std::chrono::milliseconds(100));
//			counter.increment();
//			MY_COUT << "Thread " << std::this_thread::get_id()
//				<< " incremented to: " << counter.get() << std::endl;
//#else
//			counter.increment();
//#endif
//		}
//		};
//	// 创建尝试写⼊的线程 
//	auto try_writer = [&counter]() {
//		for (int i = 0; i < N / 2; ++i) {
//#ifdef _COUT
//			std::this_thread::sleep_for(std::chrono::milliseconds(75));
//			if (counter.try_increment()) {
//				MY_COUT << "Thread " << std::this_thread::get_id()
//					<< " successfully incremented (try)" << std::endl;
//			}
//			else {
//				MY_COUT << "Thread " << std::this_thread::get_id()
//					<< " failed to increment (try)" << std::endl;
//			}
//#else
//			counter.try_increment();
//#endif
//		}
//		};
//	// 创建带超时的尝试写⼊线程 
//	auto timeout_writer = [&counter]() {
//		for (int i = 0; i < N / 2; ++i) {
//#ifdef _COUT
//			std::this_thread::sleep_for(std::chrono::milliseconds(10));
//			if (counter.try_increment_for(30)) {
//				MY_COUT << "Thread " << std::this_thread::get_id()
//					<< " successfully incremented (timeout)" << std::endl;
//			}
//			else {
//				MY_COUT << "Thread " << std::this_thread::get_id()
//					<< " failed to increment (timeout)" << std::endl;
//			}
//#else 
//			counter.try_increment_for(10);
//#endif
//		}
//		};
//	size_t begin = clock();
//	std::vector<std::thread> threads;
//	threads.emplace_back(writer);
//	//threads.emplace_back(try_writer);
//	//threads.emplace_back(timeout_writer);
//	// 创建多个读取线程 
//	for (int i = 0; i < 3; ++i) {
//		threads.emplace_back(reader);
//	}
//	for (auto& thread : threads) {
//		thread.join();
//	}
//	size_t end = clock();
//	std::cout << "Final counter value: " << counter.get() << "->" << end - begin <<
//		std::endl;
//	return 0;
//}